diff --git a/web/modals/threads/sidebars/sidebar.react.js b/web/modals/threads/sidebars/sidebar.react.js new file mode 100644 --- /dev/null +++ b/web/modals/threads/sidebars/sidebar.react.js @@ -0,0 +1,79 @@ +// @flow + +import * as React from 'react'; + +import type { ChatThreadItem } from 'lib/selectors/chat-selectors'; +import { getMessagePreview } from 'lib/shared/message-utils'; +import { shortAbsoluteDate } from 'lib/utils/date-utils'; + +import { getDefaultTextMessageRules } from '../../../markdown/rules.react'; +import { useSelector } from '../../../redux/redux-utils'; +import { useOnClickThread } from '../../../selectors/nav-selectors'; +import { useModalContext } from '../../modal-provider.react'; +import css from './sidebars-modal.css'; + +type Props = { + +sidebar: ChatThreadItem, + +isLastItem?: boolean, +}; + +function Sidebar(props: Props): React.Node { + const { sidebar, isLastItem } = props; + const { threadInfo, lastUpdatedTime, mostRecentMessageInfo } = sidebar; + + const timeZone = useSelector(state => state.timeZone); + const { popModal } = useModalContext(); + + const navigateToThread = useOnClickThread(threadInfo); + + const onClickThread = React.useCallback( + event => { + popModal(); + navigateToThread(event); + }, + [popModal, navigateToThread], + ); + + const lastActivity = React.useMemo( + () => shortAbsoluteDate(lastUpdatedTime, timeZone), + [lastUpdatedTime, timeZone], + ); + + const lastMessage = React.useMemo(() => { + if (!mostRecentMessageInfo) { + return
No messages
; + } + const { message, username } = getMessagePreview( + mostRecentMessageInfo, + threadInfo, + getDefaultTextMessageRules().simpleMarkdownRules, + ); + const previewText = username ? `${username}: ${message}` : message; + return ( + <> +
{previewText}
+
{lastActivity}
+ + ); + }, [lastActivity, mostRecentMessageInfo, threadInfo]); + + return ( + + ); +} + +export default Sidebar; diff --git a/web/modals/threads/sidebars/sidebars-modal.css b/web/modals/threads/sidebars/sidebars-modal.css new file mode 100644 --- /dev/null +++ b/web/modals/threads/sidebars/sidebars-modal.css @@ -0,0 +1,52 @@ +button.sidebarContainer { + cursor: pointer; + display: flex; + padding: 0 16px; + column-gap: 8px; + align-items: flex-start; + width: 100%; + border: none; + font-size: inherit; + text-align: inherit; + line-height: inherit; + color: inherit; + background: inherit; +} + +button.sidebarContainer:hover { + color: var(--sidebars-modal-color-hover); +} + +div.sidebarInfo { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; + padding: 8px 0; +} + +div.longTextEllipsis { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +div.lastMessage { + display: flex; + justify-content: space-between; + column-gap: 14px; +} + +div.noMessage { + text-align: center; + font-style: italic; +} + +div.lastActivity { + white-space: nowrap; +} + +img.sidebarArrow { + position: relative; + top: -12px; +} diff --git a/web/theme.css b/web/theme.css --- a/web/theme.css +++ b/web/theme.css @@ -174,4 +174,5 @@ --thread-creation-search-item-bg-hover: var(--shades-black-80); --thread-creation-search-item-info-color: var(--shades-black-60); --chat-message-list-active-border: #5989d6; + --sidebars-modal-color-hover: var(--shades-white-100); }